//=============================================================================

#ifndef AAUX_H
  #define AAUX_H

//=============================================================================

#include <math.h>
#include "aVector.h"
#include "aList.h"

//=============================================================================

class aAux
{
  private:
    aAux();

  public:
    inline float aaGetPi() {return pi;}
    inline float aaGetPid() {return pid;}
    inline float aaGetPidi() {return pidi;}
    inline aVector aaGetVectorProjection(const aVector& vec, const aVector& vec2) {return aaMultiply(vec2, aaDotMulty(vec, vec2));}
    inline float aaGetMagnitude(const aVector& vec) {return sqrt(vec.x*vec.x + vec.y*vec.y + vec.z*vec.z);}
    inline float aaDotMulty(const aVector& vec, const aVector& vec2) {return (vec.x*vec2.x + vec.y*vec2.y + vec.z*vec2.z);}
    inline float ator(float angle) {return (angle*pid);}
    inline float aaFloatAbs(float f) {return ((f) < 0.0 ? (-f):f);}
    inline aVector aaVVVXYZ2pos(const aVector& i, const aVector& j, const aVector& k, const aVector& vec) {return aaAdd(aaMultiply(i, vec.x), aaAdd(aaMultiply(j, vec.y), aaMultiply(k, vec.z)));}
    inline aVector aaGetNormal(const aVector& vec, const aVector& vec2, const aVector& vec3) {return aaNormalize(aaCrossMulty(aaSubtrack(vec2, vec), aaSubtrack(vec3, vec)));}
    inline bool aaVectorOnLine(const aVector& l1, const aVector& l2, const aVector& p) {return aaCompareFloat(aaGetLength(l1, p) + aaGetLength(l2, p), aaGetLength(l1, l2));}
    inline aVector aaGetAbsVector(const aVector& vec) {return aVector(aaFloatAbs(vec.x), aaFloatAbs(vec.y), aaFloatAbs(vec.z));}
    inline bool aaIsNormal(const aVector& vec) {return (aaCompareFloat(vec.x, 1.0) ? 1:(aaCompareFloat(vec.y, 1.0) ? 1:(aaCompareFloat(vec.z, 1.0) ? 1:0)));}

    static aAux& aaGetInstance()
    {
      static aAux aux;

      return aux;
    }
    //uVector
    aVector aaCrossMulty(const aVector&, const aVector&);
    aVector aaNormalize(const aVector&);
    float aaGetAngle(const aVector&, const aVector&);
    aVector aaRotateAroundVector(const aVector&, const aVector&, float angle);
    aVector aaSubtrack(const aVector&, const aVector&);
    aVector aaAdd(const aVector&, const aVector&);
    aVector aaAdd(const aVector&, float);
    bool aaCompareFloat(float, float);
    bool aaCompareFloatHigh(float f, float f2);
    float aaGetLength(const aVector&, const aVector&);
    aVector aaMultiply(const aVector&, float num);
    aVector aaDiv(const aVector&, float num);
    bool aaCheckVectorIn(const aVector&, const aVector&, const aVector&, const aVector&);
    aVector aaGetIntersection(const aVector&, const aVector&, const aVector&, const aVector&, const aVector&);
    float aaGetDistance(const aVector&, const aVector&);
    void aaSetVertexesAsClockwise(aList<aVector>&);
    void aaSetVertexesAsClockwise(aList<aVector>&, const aVector&, const aVector&, const aVector&, const aVector&);
    aVector aaGetLinesIntersection(const aVector&, const aVector&, const aVector&, const aVector&, const aVector&);
    aVector aaGetClosestPoint(const aVector&, const aVector&, const aVector&);
    bool aaGetSamePoints(const aVector&, const aVector&, const aVector&, const aVector&);
    bool aaVectorOnTriangleEdges(const aVector&, const aVector&, const aVector&, const aVector&);

    ~aAux();

  private:
    float pi;
    float pid;
    float pidi;
};

//=============================================================================

#endif

//=============================================================================
